package com.tedu.api.ee;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/**
 * 流---传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常----标准IO
 *
 * 异常
 * Java面向对象语言，程序中所出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable定义异常超类
 *
 * Exception异常：描述程序级别的错误----有解决方案
 *               编译期：RunTimeException异常表示类
 *                     FileOutputStream创建对象---波浪线---抛出方法之外
 *               检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *               解决方案：①捕获异常（*）
 *                       ②抛出异常---抛出方法之外--打印控制台
 *
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台输出异常对象名称，RunTimeException异常表示类
 *
 *               最后了解【throw与throws---RunTimeException】
 *
 *
 * Error错误：描述程序级别的错误---出现---程序宕机
 *           非常低--->递归：自己调自己【方法】--->
 *
 */
public class EE {
/**
 * Error  错误----程序有严重错误
 * 模拟：方法调方法---栈溢出错误
 * StackOverflowError栈溢出错误
 * ----程序宕机----
 * while(true){
 *     拼接字符串对象
 * }
 */
public  static void method(){
    method();
}
@Test
    public void testError(){
    EE.method();
}
/**
 * Exception异常：检查异常【出现编译期】---代码报波浪线
 *                两种处理手段：①捕获异常：记录错误--产生异常原因
 *                           语法：try{
 *                               怀疑代码可能有异常或者提示异常
 *                           }catch(小异常名字 e){
 *                            e.printStacktrace();打印异常信息
 *                           }catch(中异常名字 e){
 *                             e.printStacktrace();打印异常信息
 *                           }catch(大异常名字 e){  Exception
 *                               e.printStacktrace();打印异常信息
 *                           }finally{
 *                               一定执行代码块
 *                           }
 *                           快捷键：ctrl+alt+t
 *
 *                           ②抛出异常 throws 异常名字【并未解决】
 *                考试题：throw与throws的区别
 *                异常关键字：throw
 *                         throws
 *
 *              非检查异常【出现运行期】---代码无错误---控制台
 *  -------------------
 *  异常：FileNotFoundException     文件不存在异常
 *  产生原理：路径写错、文件名写错
 *  异常：Null pointerException     空指针异常
 *  产生原因：获取字符串为空，数组：值为空，集合：元素为空【存在null值】
 *  异常：StringIndexOutOfBoundsException  字符串下标越界异常
 *  产生原因：字符串下标没有对应的字符
 *  异常：NumberFormatException  数字转换异常
 *  产生原因：字符串不是正确的类型
 */
@Test
    public void testException() throws FileNotFoundException {
    //检查异常【出现编译期】---代码报波浪线
   // FileOutputStream fis=new FileOutputStream("");
    //非检查异常【出现运行期】---控制台
    try {
        String str="a";
        str.length();
        str.charAt(1);
        Integer.parseInt(str);//解析字符串--转换为对应类型
    } catch(StringIndexOutOfBoundsException e){
        e.printStackTrace();//打印异常对象信息
        System.out.println("字符串小异常：下标越界异常~~");
    }catch (NumberFormatException e) {
        e.printStackTrace(); //打印异常信息
        System.out.println("字符串小异常~~");
    }catch(Exception e){
        e.printStackTrace();
        System.out.println("大异常~~");
    } finally {
        System.out.println("一定执行代码块~");
    }
}

    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示：查API---java.long.异常
     * 字符串、包装类、集合、IO流
     */
    @Test
    public void testHomeWork1(){
        //1.NullPointerException  空指针异常
        String str=null;
       System.out.println(str.length());
        //2.ArithmeticException 计算错误
        int a=0;
        int b=10;
        int result=b/a;
        //3.NumberFormatException数字格式异常
        String str1="abc";
        int num=Integer.parseInt(str1);
        //4.ClassCastException 类型转换异常
        Object obj = new Integer(10);
        System.out.println((String)obj);
        //5.ArrayIndexOutOfBoundsException 数组索引越界异常
        int[] array = {1, 2, 3};
        int value = array[3];
    }
}
